require("apm_core")
require("ApmXml")

local httpUtil = require("ApmHttpUtil")
local lz = require("zlib")

local t_xml_tree

function decodeURI(s)
    s = string.gsub(s, '%%(%x%x)', function(h) return string.char(tonumber(h, 16)) end)
    return s
end

-- return 1: 该数据不上报;其它:上报数据
function post_analysis()
    local i_ret_fun;
    local ApmData = require("ApmData");
    local Base64 = require("Base64");
    local value;
    local xml_data;

    if ApmData.getMsgType() ~= 1 then return end

    --根据url判断
    --1.获取url
    local s_url = ApmData.getField("transaction.title", 1);
    if s_url == nil then return end

    --2.判断url和操作是否一致
    if string.find(s_url, "portal/billtype=zcbx_open") then
        --3.定义操作，完成
        ApmData.replaceField("transaction.type_code", "支出报销业务-打开");
        ApmData.replaceField("transaction.type_name", "支出报销业务-打开");
        ApmData.replaceField("transaction.title", "支出报销业务-打开");
        return
    end

    if string.find(s_url, "portal/billtype=zcbx_yx") then
        --3.定义操作，完成
        ApmData.replaceField("transaction.type_code", "支出报销业务-影像");
        ApmData.replaceField("transaction.type_name", "支出报销业务-影像");
        ApmData.replaceField("transaction.title", "支出报销业务-影像");
        return
    end

    --根据http内容体中的xml判断
    --1.取得httpbody的数据
    local s_http_body = ApmData.getField("request.body.data", 1);
    if s_http_body == nil then return end

    --2.http解码数据块的内容
    local t_kv = httpUtil.parseParams(s_http_body)
    if t_kv == nil then return end

    --3.取出xml的内容
    local s_xml = t_kv["xml"]
    if s_xml == nil then return end

    --4.正式环境xml数据有加密，需要进行以下解密
    --url解密
    --base64解密
    --解压缩
    local s_url_decode = decodeURI(s_xml);
    local s_base64_decode = Base64.decode(s_url_decode);
    if s_base64_decode == nil then return end
    local s_xml_deflated = lz.inflate()(s_base64_decode, "finish")
    if s_xml_deflated == nil then return end

    --5.解析xml的数据
    t_xml_tree = ApmXml.load(s_xml_deflated, "UTF-8")
    local s_action = ApmXml.getValue(t_xml_tree, "/root/e/p/v/text()")
    if s_action == nil then return end

    --6.对比xml数据里的操作
    if s_action == "commit" then
        --7.定义操作，完成
        ApmData.replaceField("transaction.type_code", "支出报销业务-提交");
        ApmData.replaceField("transaction.type_name", "支出报销业务-提交");
        ApmData.replaceField("transaction.title", "支出报销业务-提交");
        return
    end

end
